perm filename REDPIC.SAI[VIS,HPM]1 blob sn#359496 filedate 1978-06-03 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00009 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	  procedures for generating and dealing with reduced pictures
C00004 00003	INTEGER PROCEDURE REDDIM(INTEGER HIG,WID,BIT)
C00005 00004	INTEGER PROCEDURE RDFDIM(STRING PICFIL)
C00006 00005	INTEGER PROCEDURE MAKRED(INTEGER HIG,WID,BIT REFERENCE INTEGER REDPIC)
C00008 00006	INTEGER PROCEDURE GETRDF(STRING PICFIL REFERENCE INTEGER REDPIC)
C00010 00007	INTEGER PROCEDURE CAMRED(INTEGER CAMRA,YEDGE,XEDGE
C00012 00008	PROCEDURE FINDIN(REFERENCE INTEGER PIC INTEGER WINDOWSIZE  comment interest op
C00024 00009	REAL PROCEDURE SEARCH(REFERENCE INTEGER PIC1,PIC2 comment correlator
C00030 ENDMK
C⊗;
comment   procedures for generating and dealing with reduced pictures

a reduced picture array has the format

   word 0: NPIC number of pictures in the array
   word 1: starting index of picture 1
      ...
   word NPIC: starting index of picture NPIC

   word NPIC+1 to EOF: pictures in GUIDE.VIS format          ;

INTEGER PROCEDURE REDDIM(INTEGER HIG,WID,BIT);
comment   array size needed for set of pictures begining with one of
          size HIG x WID x BIT;
   BEGIN
   INTEGER TSIZ,I,NORD;
   TSIZ←PIXDIM(HIG,WID,BIT);
   I←WID MIN HIG; NORD←0;
   WHILE I>1 DO
      BEGIN
      NORD←NORD+1; I←I ASH -1;
      TSIZ←TSIZ+PIXDIM(HIG ASH -NORD,WID ASH -NORD,(BIT+2*NORD) MIN 9);
      END;
   RETURN(TSIZ+NORD+1+1);
   END;

INTEGER PROCEDURE RDFDIM(STRING PICFIL);
comment  array size for reduced picture set begining with pic in PICFIL;
   BEGIN
   INTEGER ARRAY T[0:10];
   IF GETPFD(PICFIL,T[0])≤0 THEN RETURN(0) ELSE
   RETURN(REDDIM(T[PCLN],T[LNBY],T[BYBI]));
   END;

INTEGER PROCEDURE MAKRED(INTEGER HIG,WID,BIT; REFERENCE INTEGER REDPIC);
comment  make a skeleton array of reduced pictures whose first member
         is of size HIG x WID x PIC;
   BEGIN
   INTEGER I,J,NORD,NPIC;

   I←WID MIN HIG; NORD←0;
   WHILE I>1 DO
      BEGIN
      NORD←NORD+1; I←I ASH -1;
      END;
   NPIC←NORD+1;

   MEMORY[LOCATION(REDPIC)  ]←NPIC;
   MEMORY[LOCATION(REDPIC)+1]←NPIC+1;
   MAKPIX(HIG,WID,BIT,MEMORY[LOCATION(REDPIC)+NPIC+1]);

   J←NPIC+1+PIXDIM(HIG,WID,BIT);
   FOR I←1 STEP 1 UNTIL NORD DO 
      BEGIN
      MEMORY[LOCATION(REDPIC)+I+1]←J;
      J←J+PIXDIM(HIG ASH -I,WID ASH -I,(BIT+2*I) MIN 9);
      MAKPIX(HIG ASH -I,WID ASH -I,(BIT+2*I) MIN 9,
             MEMORY[LOCATION(REDPIC)+MEMORY[LOCATION(REDPIC)+I+1]]);
      END;
   RETURN(J);
   END;
INTEGER PROCEDURE GETRDF(STRING PICFIL; REFERENCE INTEGER REDPIC);
comment  read in a picture file, and make a set of reductions of it;
   BEGIN
   INTEGER ARRAY T[0:10];
   INTEGER I,J,NORD,NPIC, HIG,WID,BIT;

   IF GETPFD(PICFIL,T[0])≤0 THEN RETURN(0);
   HIG←T[PCLN]; WID←T[LNBY]; BIT←T[BYBI];

   I←WID MIN HIG; NORD←0;
   WHILE I>1 DO
      BEGIN
      NORD←NORD+1; I←I ASH -1;
      END;
   NPIC←NORD+1;

   MEMORY[LOCATION(REDPIC)  ]←NPIC;
   MEMORY[LOCATION(REDPIC)+1]←NPIC+1;
   GETPFL(PICFIL,MEMORY[LOCATION(REDPIC)+NPIC+1]);

   J←NPIC+1+PIXDIM(HIG,WID,BIT);
   FOR I←1 STEP 1 UNTIL NORD DO 
      BEGIN
      MEMORY[LOCATION(REDPIC)+I+1]←J;
      J←J+PIXDIM(HIG ASH -I,WID ASH -I,(BIT+2*I) MIN 9);
      HAFPIC(MEMORY[LOCATION(REDPIC)+MEMORY[LOCATION(REDPIC)+I  ]],
             MEMORY[LOCATION(REDPIC)+MEMORY[LOCATION(REDPIC)+I+1]], 9);
      END;
   RETURN(J);
   END;
INTEGER PROCEDURE CAMRED(INTEGER CAMRA,YEDGE,XEDGE;
                                  REFERENCE INTEGER PIC;
                                  INTEGER SUMS(1),BCLIP(7),TCLIP(0),NTRY(10));
comment  read in a picture from a camera, and make a set of reductions of it;
   BEGIN
   INTEGER I,NORD,NPIC,RETRY;

   NPIC←PIC;  NORD←NPIC-1;
   RETRY←CAMPIX(CAMRA,YEDGE,XEDGE,MEMORY[LOCATION(PIC)+MEMORY[LOCATION(PIC)+1]],
                                  SUMS,BCLIP,TCLIP,NTRY);
   FOR I←1 STEP 1 UNTIL NORD DO 
      HAFPIC(MEMORY[LOCATION(REDPIC)+MEMORY[LOCATION(REDPIC)+I  ]],
             MEMORY[LOCATION(REDPIC)+MEMORY[LOCATION(REDPIC)+I+1]], 9);
   RETURN(RETRY);
   END;
PROCEDURE FINDIN(REFERENCE INTEGER PIC; INTEGER WINDOWSIZE;  comment interest op;
                 REFERENCE INTEGER NFS; REFERENCE REAL FY,FX);
comment  applies the local max of minimum directional variance interest
         operator to produce a list of interesting points in arrays
	 FY and FX, sorted in order of decreasing variance. NFS
         is initialized to maximum number of features, is set by
	 procedure to actual number found;
   BEGIN
   INTEGER IORD,HIG,WID,BIT,IW,HW;

   IORD←0; WHILE (WINDOWSIZE ASH -(IORD+1))≥2 DO IORD←IORD+1;
   IW←WINDOWSIZE ASH -IORD;
   HW←(IW+1)%2;
   IW←2*HW;
   
   HIG←MEMORY[LOCATION(PIC)+MEMORY[LOCATION(PIC)+IORD+1]+PCLN];
   WID←MEMORY[LOCATION(PIC)+MEMORY[LOCATION(PIC)+IORD+1]+LNBY];
   BIT←MEMORY[LOCATION(PIC)+MEMORY[LOCATION(PIC)+IORD+1]+BYBI];

      BEGIN
      INTEGER IAV,I,J,K,AH,AW,FHAV,AWR,AHR;
      SAFE INTEGER ARRAY
      INTER[ 0 : AH ← (HIG-HW-1)%IW + (HIG-1)%IW - 1,
             0 : AW ← (WID-HW-1)%IW + (WID-1)%IW - 1 ];
      REAL ARRAY FXV,FYV,FIV[1:NFS];

         BEGIN
         INTEGER AH,AW;
         SAFE INTEGER ARRAY I00[-2:AH←(HIG-1)%IW-1, 0:AW←(WID-1)%IW-1];
         IAV←INTOP(MEMORY[LOCATION(PIC)+MEMORY[LOCATION(PIC)+IORD+1]],
                   IW,I00[0,0],0,0);
         FOR I←0 STEP 1 UNTIL AH DO
         FOR J←0 STEP 1 UNTIL AW DO
            INTER[I*2,J*2]←I00[I,J];
         END;

         BEGIN
         INTEGER AH,AW;
         SAFE INTEGER ARRAY I10[-2:AH←(HIG-HW-1)%IW-1, 0:AW←(WID-1)%IW-1];
         IAV←IAV+INTOP(MEMORY[LOCATION(PIC)+MEMORY[LOCATION(PIC)+IORD+1]],
                       IW,I10[0,0],HW,0);
         FOR I←0 STEP 1 UNTIL AH DO
         FOR J←0 STEP 1 UNTIL AW DO
            INTER[I*2+1,J*2]←I10[I,J];
         END;

         BEGIN
         INTEGER AH,AW;
         SAFE INTEGER ARRAY I01[-2:AH←(HIG-1)%IW-1, 0:AW←(WID-HW-1)%IW-1];
         IAV←IAV+INTOP(MEMORY[LOCATION(PIC)+MEMORY[LOCATION(PIC)+IORD+1]],
                       IW,I01[0,0],0,HW);
         FOR I←0 STEP 1 UNTIL AH DO
         FOR J←0 STEP 1 UNTIL AW DO
            INTER[I*2,J*2+1]←I01[I,J];
         END;

         BEGIN
         INTEGER AH,AW;
         SAFE INTEGER ARRAY I11[-2:AH←(HIG-HW-1)%IW-1, 0:AW←(WID-HW-1)%IW-1];
         IAV←IAV+INTOP(MEMORY[LOCATION(PIC)+MEMORY[LOCATION(PIC)+IORD+1]],
                       IW,I11[0,0],HW,HW);
         FOR I←0 STEP 1 UNTIL AH DO
         FOR J←0 STEP 1 UNTIL AW DO
            INTER[I*2+1,J*2+1]←I11[I,J];
         END;

      IAV←IAV%32;

      INTLOM(AH+1,AW+1,INTER[0,0]);  comment  flag local maxima;

      FHAV←0;

      FOR I←1 STEP 1 UNTIL AH-2 DO
      FOR J←1 STEP 1 UNTIL AW-1 DO
      IF (INTER[I,J] LAND 1)=1 ∧ INTER[I,J]>IAV THEN
         BEGIN
         REAL FXT,FYT,FIT;
         INTEGER L,H,M;

         FYT←((I+1)*HW+.5)/HIG;
         FXT←((J+1)*HW+.5)/WID;
         FIT←INTER[I,J];

         L←1; H←FHAV;
         WHILE L≤H DO IF FIT>FIV[M←(L+H)%2] THEN H←M-1 ELSE L←M+1;
         FHAV←(FHAV+1) MIN NFS;
         IF L≤FHAV THEN
            BEGIN
            FOR M←FHAV-1 STEP -1 UNTIL L DO
               BEGIN
               FXV[M+1]←FXV[M]; FYV[M+1]←FYV[M]; FIV[M+1]←FIV[M];
               END;
            FXV[L]←FXT; FYV[L]←FYT; FIV[L]←FIT;
            END;
         END;

      FOR I←1 STEP 1 UNTIL FHAV DO
         BEGIN
         MEMORY[LOCATION(FX)-1+I,REAL]←FXV[I];
         MEMORY[LOCATION(FY)-1+I,REAL]←FYV[I];
         END;
      NFS←FHAV;
      END;

   END;
REAL PROCEDURE SEARCH(REFERENCE INTEGER PIC1,PIC2; comment correlator;
		      INTEGER WINDOWSIZE;
		      REFERENCE REAL POSY,POSX;
		      REAL DY1(0),DX1(0),DY2(1),DX2(1) );

COMMENT applies the binary search correlation method to find a window
        centered about POSX,POSY in PIC1 (defined to be 0 to 1 in X and Y),
	and of size WINDOWSIZE pixels square in the whole of PIC2. PIC1
	and PIC2 are reduced picture sets. The best match in PIC2 is returned
	in POSX and POSY, the value of the match (0 to 1) is the value of SEARCH.
        The search can be constrained to the rectangle bounded by DY1,DX1,
	DY2,DX2 (all 0 to 1) if desired;

   BEGIN
   INTEGER IL,JL,IH,JH,WID,HIG,NORD,I,J,K,L,M,N;   REAL QUAL;
   REAL PXF,PYF;
   INTEGER ILT,JLT,IHT,JHT,
           ILS,JLS,IHS,JHS,
           ISC,JSC,ITC,JTC,
           ISS,JSS,ITS,JTS;
   REAL QUALT,PXFT,PYFT;

   BOOLEAN PROCEDURE TRYRED(INTEGER MS,MT);
      BEGIN
      BOOLEAN ANS;
      ANS←FALSE;
      IF QUALT<.8 THEN
         BEGIN
         REAL PXFTT,PYFTT,QUALTT,QUATTT;
         INTEGER WISH; BOOLEAN LOSE;

         ISC←(ISS←MEMORY[LOCATION(PIC1)+MEMORY[LOCATION(PIC1)+MS+1]+PCLN])*POSY;
         JSC←(JSS←MEMORY[LOCATION(PIC1)+MEMORY[LOCATION(PIC1)+MS+1]+LNBY])*POSX;
         ITC←(ITS←MEMORY[LOCATION(PIC2)+MEMORY[LOCATION(PIC2)+MT+1]+PCLN])*PYF;
         JTC←(JTS←MEMORY[LOCATION(PIC2)+MEMORY[LOCATION(PIC2)+MT+1]+LNBY])*PXF;

         WISH←WINDOWSIZE; QUALTT←0;
         DO
            BEGIN
            LOSE←TRUE;
            WISH←WISH%2;

            JLS←JSC-WISH;
            ILS←ISC-WISH;
            JHS←JSC+WISH;
            IHS←ISC+WISH;

            JLT←(JTC-WINDOWSIZE) MAX (JTS*DX1-WISH-1);
            ILT←(ITC-WINDOWSIZE) MAX (ITS*DY1-WISH-1);
            JHT←(JTC+WINDOWSIZE) MIN (JTS*DX2+WISH+1);
            IHT←(ITC+WINDOWSIZE) MIN (ITS*DY2+WISH+1);

            QUATTT←NORCOR(MEMORY[LOCATION(PIC1)+MEMORY[LOCATION(PIC1)+MS+1]],
                          ILS,JLS,IHS,JHS,
                          MEMORY[LOCATION(PIC2)+MEMORY[LOCATION(PIC2)+MT+1]],
                          ILT,JLT,IHT,JHT);

            IF QUATTT>QUALTT THEN
               BEGIN
               PXFTT←0.5*(JLT+JHT)/JTS;
               PYFTT←0.5*(ILT+IHT)/ITS;
               QUALTT←QUATTT;
               LOSE←FALSE;
               END;
            END
         UNTIL QUALTT≥.65 ∨ WISH≤1 ∨ LOSE;
         SETFORMAT(0,3);
         IF QUALTT>QUALT THEN
            BEGIN
            QUALT←QUALTT;
            PXFT←PXFTT;
            PYFT←PYFTT;
            ANS←TRUE;
            END;
         RETURN(ANS);
         END;
      END;

   IF DX1>DX2 THEN DX1↔DX2;
   IF DY1>DY2 THEN DY1↔DY2;
   IF DX1≥1∨DX2≤0∨DY1≥1∨DY2≤0 THEN RETURN(0);
   DX1←DX1 MAX 0; DX2←DX2 MIN 1; DY1←DY1 MAX 0; DY2←DY2 MIN 1;

   WID←MEMORY[LOCATION(PIC1)+MEMORY[LOCATION(PIC1)+1]+LNBY]*ABS(DX2-DX1);
   HIG←MEMORY[LOCATION(PIC1)+MEMORY[LOCATION(PIC1)+1]+PCLN]*ABS(DY2-DY1);
   NORD←0;
   WHILE WINDOWSIZE≤(WID MIN HIG)/2↑(NORD+1) DO NORD←NORD+1;


   PXF←(DX1+DX2)/2; PYF←(DY1+DY2)/2;
   QUAL←1;

   FOR M←NORD STEP -1 UNTIL 0 DO
      BEGIN
      QUALT←-1.0;

      TRYRED(M,M);

      PXF←PXFT;
      PYF←PYFT;

      QUAL←QUAL MIN QUALT;
      END;

   POSX←PXF; POSY←PYF;
   RETURN(QUAL);
   END;